package Reflect01;

import Reflect.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
反射获取构造方法并使用
 */
public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取class对象
        Class<?> c = Class.forName("Reflect.Student");

        //getConstructors() 返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造类对象。
//        Constructor<?>[] cons = c.getConstructors();

        //getDeclaredConstructors()返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组类 。
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for (Constructor con : cons) {
            System.out.println(con);//没有看到私有和默认的
        }
        System.out.println("--------");
        //getConstructor(类<?>... parameterTypes)返回一个 Constructor对象，该对象反映 Constructor对象表示的类的指定的公共 类函数。
        //getDeclaredConstructor(类<?>... parameterTypes)返回一个 Constructor对象，该对象反映 Constructor对象表示的类或接口的指定类函数。
        //参数：你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象

        Constructor<?> con = c.getConstructor();

        //Constructor提供了一个类的单个构造函数的信息和访问。
        //T newInstance(Object... initargs)使用此 Constructor对象表示的构造函数，使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
        Object obj = con.newInstance();//默认返回了Object类型
        System.out.println(obj);//Student{name='null', age=0, address='null'} 学生类中重写了toString方法



//        Student s=new Student();
//        System.out.println(s);

    }
}
